package io.zhengsh.juc.reentrantlock;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockTest {

    public static void main(String[] args) {

        // 带入一个英航办理业务的案例来模拟我们的 AQS 是如何进行线程的管理和通知唤醒机制
        // 3 个线程来模拟银行网点，受理窗口办理业务的顾客

        // A 顾客就是第一个顾客，此时受理窗口没有任何人， A可以直接去办理
        Lock lock = new ReentrantLock();
        new Thread(() -> {
            lock.lock();
            System.out.println("  -------> A Thread come in");
            //  暂停几秒钟线程
            try { TimeUnit.MINUTES.sleep(20); } catch (InterruptedException e) {e.printStackTrace();}
            lock.unlock();
        }, "A").start();

        // 第2个顾客，由于业务窗口只有一个（只能有一个线程持有锁），此时 B进行等待
        // 进入候客区
        new Thread(() -> {
            lock.lock();
            System.out.println("  -------> B Thread come in");
            try { TimeUnit.MINUTES.sleep(20); } catch (InterruptedException e) {e.printStackTrace();}
            lock.unlock();
        }, "B").start();

        // 第3个顾客，由于业务窗口只有一个（只能有一个线程持有锁），此时 C进行等待
        // 进入候客区
        new Thread(() -> {
            lock.lock();
            System.out.println("  -------> C Thread come in");
            try { TimeUnit.MINUTES.sleep(20); } catch (InterruptedException e) {e.printStackTrace();}
            lock.unlock();
        }, "C").start();
    }

    private static void m1() {
        Lock lock = new ReentrantLock();
        lock.lock();
        // 业务逻辑
        // 业务逻辑
        // 业务逻辑
        lock.unlock();
    }
}
